package com.fwtai.service;

import com.fwtai.exception.ExceptionCompletion;
import com.fwtai.tool.IdBuilder;
import com.fwtai.tool.ToolClient;
import com.fwtai.tool.ToolListOrMap;
import com.fwtai.web.GoodsAreaDao;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**区代处理商品及商品对应的优惠券规则的库存*/
@Service
public final class ServiceCouponArea{

  private final GoodsAreaDao goodsAreaDao;

  public ServiceCouponArea(final GoodsAreaDao goodsAreaDao){
    this.goodsAreaDao = goodsAreaDao;
  }

  /**代理的区域及特殊区域(area_id)*/
  public Long getAreaId(final HashMap<String,Object> result,final int type){
    switch (type){//其实就是sys_area.level的值
      case 1:
        return (Long) result.get("province_id");
      case 2:
        return (Long) result.get("city_id");
      case 3:
      case 4://比如东莞市下的全是镇,东莞市下的没有区直接到镇(所以3或4都是区县级)
        return (Long) result.get("county_id");
      default:
        return (Long) result.get("area_id");//特殊区域的代理
    }
  }

  /**代理的区域id是已设为特殊区域(即表partner的字段area_id的值)才调用本方法获取代理的全部上级区域的id*/
  public void getCustomId(final HashMap<String,Object> result,final int level,final ArrayList<Long> areaIds){
    switch (level){//当level=1时,那areaId就是本身,调用前先处理
      case 2:
        areaIds.add((Long) result.get("kid1"));
        areaIds.add((Long) result.get("kid2"));
        break;
      case 3:
        areaIds.add((Long) result.get("kid1"));
        areaIds.add((Long) result.get("kid2"));
        areaIds.add((Long) result.get("kid3"));
        break;
      case 4://仅支持到街道级别
        if(!result.containsKey("kid4")){
          throw new ExceptionCompletion("代理的行政区域有误");
        }
        areaIds.add((Long) result.get("kid1"));
        areaIds.add((Long) result.get("kid2"));
        areaIds.add((Long) result.get("kid3"));
        areaIds.add((Long) result.get("kid4"));
        break;
      default:
        throw new ExceptionCompletion("未指定代理级别");
    }
  }

  public String addCoupon(final HashMap<String,Object> result){
    if(result == null){
      return ToolClient.createJsonFail("区代账号不存在，请重新输入");
    }
    final Integer type = (Integer)result.get("type");//其实就是sys_area.level的值
    final boolean custom = result.containsKey("area_id");//是否存在表partner的字段area_id,存在说明所代理的是特殊区域
    final Long areaId = custom ? getAreaId(result,8) : getAreaId(result,type);//传入数字8的目的是拿area_id的值,也就是case的default
    if(areaId == null){
      return ToolClient.createJsonFail("不是有效的区代账号，请检查");
    }
    final List<HashMap<String,Object>> list = goodsAreaDao.getGoodsCoupon();//全国默认的优惠券发放规则,由商品id及商品优惠券构成多种商品
    //获取商品id
    final Long[] goodsIds = new Long[list.size()];
    for(int i = list.size() - 1; i >= 0; i--){
      goodsIds[i] = (Long) list.get(i).get("kid");//kid是商品id
    }
    //我仅勾选省级,默认就包含所有市，及所有的市的所有区，也就是包含整个省;以最小被勾选的区域优先级最高
    final HashMap<String,Object> params = new HashMap<>(2);
    params.put("array",goodsIds);
    final ArrayList<Long> areaIds = new ArrayList<>(4);
    //判断代理商所代理的区域是否是设定为特殊区域,即是否取表partner的字段area_id的值
    if(custom){//是代理的是特殊区域,则通过表partner的字段area_id的值与sys_area查询区域的等级level,然后查询该区域的所有的上级区域,↓↓↓
      final Integer level = goodsAreaDao.getAreaLevel(areaId);//通过表partner的字段area_id的值与sys_area查询区域的等级level,即level的值,然后查询该区域的所有的上级区域,如果level=1时那areaId就是本身
      if(level != 1){//通过areaId查询sys_area的字段level如果不是1则查询该区域的所有的上级区域;如果是1则直接就是省级代理,直接取值即可
        final HashMap<String,Object> areaMap = goodsAreaDao.getAreaCustom(level,areaId);//然后查询该区域的所有的上级区域(即表partner的字段area_id的值)
        if(areaMap == null){
          return ToolClient.createJsonFail("代理的区域有误，请联系管理员");
        }
        getCustomId(areaMap,level,areaIds);
      }else{
        areaIds.add(areaId);//通过areaId查询sys_area的字段level=1时,那areaId就是本身,直接取值即可
      }
    }else{
      areaIds.add((Long) result.get("province_id"));
      areaIds.add((Long) result.get("city_id"));
      areaIds.add((Long) result.get("county_id"));
    }
    params.put("areaIds",areaIds);
    //通过普通区域省(province_id)、市(city_id)、区(county_id)或特殊区域的area_id的id查询优惠券发放规则表，判断已哪一个规则发放优惠券,只取优惠券表coupon的goods_id和type最大值MAX(type),因为优先级是字段type从大到小
    final List<HashMap<String,Object>> listAreaCoupon = goodsAreaDao.getAreaCoupon(params);//商品id及区域id,获取优惠券规则
    if(!listAreaCoupon.isEmpty()){//优惠券设定区域不为空时替换默认的优惠券规则
      replaceCoupon(list,listAreaCoupon);
    }
    final long userId = (Long)result.get("user_id");
    final List<HashMap<String,Object>> goodsRecord = goodsAreaDao.getGoodsRecord(userId);//获取已存在的商品及商品优惠券数量(由商品id及商品的多个优惠券数量构成多种商品规格)
    if(goodsRecord.size() > 0){//若已存在的商品的则移除掉，即仅需同步过的商品及商品对应的商品优惠券数据(同一个userId通过`商品`及`商品对应的商品优惠券数据`来确定为商品规格,即唯一)
      replaceValue(goodsRecord,list);
    }
    if(list.isEmpty()){
      return ToolClient.createJsonSuccess("操作成功，未上架新的商品");
    }
    final ArrayList<HashMap<String,Object>> goods = new ArrayList<>(list.size());
    getGoods(goods,list,userId);
    final int rows = goodsAreaDao.addGoodsArea(goods);
    return rows > 0 ? ToolClient.createJsonSuccess("操作成功，共上架"+rows+"个商品") : ToolClient.createJsonSuccess("操作成功");
  }

  /**把`全国默认的优惠券值`替换为`指定区域的优惠券数量`，注意，区域不是表partner的特殊区域字段area_id哦。指的是商品优惠券表coupon的字段area_id的值*/
  public void replaceCoupon(final List<HashMap<String,Object>> list,final List<HashMap<String,Object>> listAreaCoupon){
    for(int x = list.size() - 1; x >= 0; x--){
      final HashMap<String,Object> map = list.get(x);
      final Object kid = map.get("kid");
      for(int y = listAreaCoupon.size() - 1; y >= 0; y--){
        final HashMap<String,Object> hashMap = listAreaCoupon.get(y);
        final Object goodsId = hashMap.get("goods_id");
        if(kid.equals(goodsId)){
          map.put("coupon",hashMap.get("quantity"));//把`全国默认的优惠券值`替换为`指定区域的优惠券数量`，注意，区域不是表partner的特殊区域字段area_id哦。指的是商品优惠券表coupon的字段area_id的值
          break;
        }
      }
    }
  }

  /**若已存在的商品的则移除掉，即仅需同步过的商品及商品对应的商品优惠券数据(同一个userId通过`商品`及`商品对应的商品优惠券数据`来确定为商品规格,即唯一)*/
  public void replaceValue(final List<HashMap<String,Object>> goodsRecord,final List<HashMap<String,Object>> list){
    final ArrayList<Object> values = new ArrayList<>();
    for(int x = goodsRecord.size() - 1; x >= 0; x--){
      final HashMap<String,Object> map = goodsRecord.get(x);
      final Long goodsId = (Long) map.get("goods_id");
      for(int y = list.size() - 1; y >= 0; y--){
        final HashMap<String,Object> hashMap = list.get(y);
        final Long kid = (Long)hashMap.get("kid");
        if(goodsId.equals(kid)){
          values.add(kid);
          hashMap.put("quantity",map.get("coupon"));
          break;
        }
      }
    }
    final HashMap<Object,Object> keys = new HashMap<>(1);
    keys.put("coupon","quantity");
    ToolListOrMap.listRemoveElement(list,"kid",values,keys);//处理同一个的优惠券一致的移除
  }

  /**构建区代的数据，用于数据保存*/
  public void getGoods(final ArrayList<HashMap<String,Object>> goods,final List<HashMap<String,Object>> list,final long userId){
    for(int i = list.size() - 1; i >= 0; i--){
      final HashMap<String,Object> hashMap = list.get(i);
      final HashMap<String,Object> map = new HashMap<>(5);
      map.put("kid",new IdBuilder().getId121L());
      map.put("goods_id",hashMap.get("kid"));
      map.put("user_id",userId);//购买人的userId
      map.put("inventory",0);
      map.put("coupon",hashMap.get("coupon"));
      goods.add(map);
    }
  }
}